package caidan.data;

import caidan.SearchDialog;
import caidan.data.FoodMaterial.FoodMaterialPanel;
import caidan.res.Resource;
import jinyilw.common.Alignment;
import jinyilw.common.Operator;
import jinyilw.swing.FontTools;
import jinyilw.swing.SwingTools;
import jinyilw.swing.rlaf.utils.RBorderFactory;
import jinyilw.swing.visuals.comp.ActScaleImageComp;
import jinyilw.swing.visuals.layout.OneRowLayout;

import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MaterialPane extends JPanel
{
	private static final long serialVersionUID = 4456806190094626028L;
	private static final Dimension comboBoxSize = new Dimension(80, 23);
	private static final Dimension spinnerSize = new Dimension(56, 22);
	private final JComboBox typeComboBox = new JComboBox(Material.allMaterialTypes);
	private final JComboBox classifyComboBox = new JComboBox();
	private final JComboBox dataComboBox = new JComboBox();
	private final SpinnerNumberModel qualityNumberModel = new SpinnerNumberModel(0, 0,
			1000, 1);
	private final JLabel qualityLabel = new JLabel(" 用量(克):");
	private final JSpinner qualitySpinner = new JSpinner(qualityNumberModel);
	private final ActScaleImageComp searchComp = new ActScaleImageComp(
			Resource.searchIcon);

	private ActionListener typeComboBoxListener;
	private ActionListener classifyComboBoxListener;
	private ActionListener dataComboBoxListener;
	private Material material = Material.unChooseMaterial;
	private final Operator<Material> operator;
	// private String description;
	private final FoodMaterialPanel foodMaterialPanel;

	public MaterialPane(FoodMaterialPanel foodMaterialPanel, String description,
			Operator<Material> operator)
	{
		super(new OneRowLayout(Alignment.LEFT));
		setBorder(RBorderFactory.getDefaultBorder());
		Font font = FontTools.getSystemFont(12);
		typeComboBox.setFont(font);
		classifyComboBox.setFont(font);
		dataComboBox.setFont(font);
		qualityLabel.setFont(font);
		qualitySpinner.setFont(font);

		typeComboBox.setFocusable(false);
		classifyComboBox.setFocusable(false);
		dataComboBox.setFocusable(false);

		typeComboBox.setPreferredSize(comboBoxSize);
		classifyComboBox.setPreferredSize(comboBoxSize);
		dataComboBox.setPreferredSize(comboBoxSize);
		qualitySpinner.setPreferredSize(spinnerSize);
		SwingTools.makeSpinnerTextCenter(qualitySpinner);
		this.foodMaterialPanel = foodMaterialPanel;
		this.operator = operator;
		// this.description = description;
		JLabel dLabel = new JLabel(description);
		dLabel.setFont(font);
		super.add(dLabel);
		super.add(typeComboBox);
		super.add(searchComp);
		initListeners();
	}

	private void initListeners()
	{
		typeComboBoxListener = (ActionEvent e) ->
		{
			// System.out.println(description +
			// ":typeComboBoxItemListener");
			setMaterial(Material.getMaterial(typeComboBox.getSelectedIndex(), 0,
					0));
		};

		classifyComboBoxListener = (ActionEvent e) ->
		{
			//				System.out
			//						.println(description + ":classifyComboBoxItemListener");
			setMaterial(Material.getMaterial(typeComboBox.getSelectedIndex(),
					classifyComboBox.getSelectedIndex(), 0));
		};

		dataComboBoxListener = (ActionEvent e) ->
		{
			// System.out.println(description +
			// ":dataComboBoxItemListener");
			setMaterial(Material.getMaterial(typeComboBox.getSelectedIndex(),
					classifyComboBox.getSelectedIndex(),
					dataComboBox.getSelectedIndex()));
		};

		searchComp.addClickOperator((Object o) ->
		{
			SearchDialog searchDialog = foodMaterialPanel.getSearchDialog();
			searchDialog.resetContent();
			searchDialog.setMaterialPane(this);
			searchDialog.setVisible(true);
		});

		typeComboBox.addActionListener(typeComboBoxListener);
		classifyComboBox.addActionListener(classifyComboBoxListener);
		dataComboBox.addActionListener(dataComboBoxListener);
	}

	public void setMaterial(Material material)
	{
		if (this.material == material)
			return;
		this.material = material;
		MaterialType materialType = null;
		if (material != null)
			materialType = material.getMaterialType();
		if (material == null || material == Material.unChooseMaterial
				|| materialType == Material.noneType)
		{
			remove(classifyComboBox);
			remove(dataComboBox);
			remove(qualityLabel);
			remove(qualitySpinner);
			typeComboBox.removeActionListener(typeComboBoxListener);
			typeComboBox.setSelectedIndex(0);
			typeComboBox.addActionListener(typeComboBoxListener);
			this.material = Material.unChooseMaterial;
		} else
		{
			typeComboBox.removeActionListener(typeComboBoxListener);
			classifyComboBox.removeActionListener(classifyComboBoxListener);
			dataComboBox.removeActionListener(dataComboBoxListener);

			typeComboBox.setSelectedIndex(material.getType());
			classifyComboBox.setModel(materialType.getComboBoxModel());
			classifyComboBox.setSelectedIndex(material.getClassify());
			if (classifyComboBox.getParent() == null)
				remove(searchComp);
			add(classifyComboBox);
			if (materialType.isClassifyData())
			{
				MaterialData materialData = materialType
						.getMaterialData(material.getClassify());
				dataComboBox.setModel(materialData.getComboBoxModel());
				dataComboBox.setSelectedIndex(material.getData());
				add(dataComboBox);
			} else
				remove(dataComboBox);
			add(qualityLabel);
			add(qualitySpinner);
			add(searchComp);

			typeComboBox.addActionListener(typeComboBoxListener);
			classifyComboBox.addActionListener(classifyComboBoxListener);
			dataComboBox.addActionListener(dataComboBoxListener);
		}
		revalidate();
		repaint();
		if (operator != null)
			operator.operate(this.material);
	}

	public void setQuality(short quality)
	{
		qualityNumberModel.setValue(quality);
	}

	public short getQuality()
	{
		return qualityNumberModel.getNumber().shortValue();
	}

	public JSpinner getQualitySpinner()
	{
		return qualitySpinner;
	}

	public Material getMaterial()
	{
		return material;
	}

	@Override
	public Component add(Component comp)
	{
		if (comp.getParent() == null)
			super.add(comp);
		return comp;
	}

	/**
	 * 地址选择
	 */
	//	private void address()
	//	{
	//		JLabel addressLabel = new JLabel("地\0\0址:");
	//		addressLabel.setBounds(20, 180, 50, 20);
	//
	//		JComboBox<String> mProvenceComboBox = new JComboBox<String>();
	//		mProvenceComboBox.setModel(new DefaultComboBoxModel<String>(
	//				new String[]{"--请选择省/市--", "北京市", "天津市", "重庆市", "上海市", "辽宁省",
	//						"吉林省", "黑龙江省", "河北省", "山西省", "河南省", "山东省", "江苏省", "安徽省",
	//						"江西省", "浙江省", "福建省", "广东省", "海南省", "台湾省", "贵州省", "云南省",
	//						"四川省", "湖南省", "湖北省", "陕西省", "甘肃省", "青海省", "内蒙古自治区",
	//						"西藏自治区", "新疆维吾尔自治区", "广西壮族自治区", "宁夏回族自治区"}));
	//		mProvenceComboBox.setBounds(70, 180, 130, 20);
	//
	//		JComboBox<String> mCityComboBox = new JComboBox<String>();
	//		mCityComboBox.setModel(
	//				new DefaultComboBoxModel<String>(new String[]{"--请选择市/区/县--"}));
	//		mCityComboBox.setBounds(210, 180, 130, 20);
	//		mProvenceComboBox.addItemListener(new ItemListener()
	//		{
	//			@Override
	//			public void itemStateChanged(ItemEvent e)
	//			{
	//				String[][] cityStr = {{"--请选择市/区/县--"},
	//						{"东城区", "西城区", "崇文区", "宣武区", "朝阳区", "海淀区", "丰台区",
	//								"门头沟区", "房山县", "大兴县", "顷义县", "平谷县", "密云县",
	//								"怀柔县", "昌平县", "延庆县", "通县"},
	//						{"和平区", "河北区", "河东区", "河西区", "南开区", "红桥区", "东丽区", "西青区",
	//								"津南区", "北辰区", "塘沽区", "汉沽区", "大港区", "蓟县", "宝坻县",
	//								"武清县", "静海县", "宁河县"},
	//						{"渝中区", "大渡口区", "江北区", "沙坪坝区", "九龙坡区", "南岸区", "北碚区",
	//								"万盛区", "双桥区", "渝北区", "巴南区", "万州区", "涪陵区", "黔江区",
	//								"长寿区", "江津区", "永川区", "合川区", "南川区", "綦江县", "潼南县",
	//								"荣昌县", "璧山县", "大足县", "铜梁县", "梁平县", "城口县", "垫江县",
	//								"武隆县", "丰都县", "奉节县", "开县", "云阳县", "忠县", "巫溪县",
	//								"巫山县", "石柱土家族自治县", "秀山土家族苗族自治县", "酉阳土家族苗族自治县",
	//								"彭水苗族土家族自治县"},
	//						{"上海黄浦区", "卢湾区", "金山区", "徐汇区", "长宁区", "静安区", "普陀区",
	//								"闸北区", "虹口区", "杨浦区", "闵行区", "宝山区", "嘉定区",
	//								"浦东新区", "松江区", "青浦区", "南汇区", "奉贤区", "崇明区"},
	//						{"沈阳市", "大连市", "鞍山市", "抚顺市", "本溪市", "丹东市", "锦州市",
	//								"葫芦岛市", "营口市", "盘锦市", "阜新市", "辽阳市", "铁岭市",
	//								"朝阳市", "凌源市", "北票市"},
	//						{"长春市", "吉林市", "四平市", "辽源市", "通化市", "白山市", "延边朝鲜族自治州",
	//								"白城市", "松原市"},
	//						{"哈尔滨市", "齐齐哈尔市", "鹤岗市", "双鸭山市", "鸡西市", "大庆市", "伊春市",
	//								"牡丹江市", "佳木斯市", "台河市", "黑河市", "绥化市", "大兴安岭地区"},
	//						{"石家庄市", "唐山市", "秦皇岛市", "邯郸市", "邢台市", "保定市", "张家口市",
	//								"承德市", "廊坊市", "衡水市", "沧州市"},
	//						{"太原市", "大同市", "阳泉市", "长治市", "晋城市", "朔州市", "晋中市", "运城市",
	//								"忻州市", "临汾市", "吕梁地区"},
	//						{"郑州市", "开封市", "洛阳市", "平顶山市", "焦作市", "鹤壁市", "新乡市",
	//								"安阳市", "濮阳市", "许昌市", "漯河市", "三门峡市", "南阳市",
	//								"商丘市", "信阳市", "周口市", "驻马店市", "济源市"},
	//						{"济南市", "青岛市", "淄博市", "枣庄市", "东营市", "潍坊市", "烟台市", "威海市",
	//								"济宁市", "泰安市", "日照市", "莱芜市", "临沂市", "德州市", "聊城市",
	//								"滨州市", "菏泽市"},
	//						{"南京市", "徐州市", "连云港市", "淮安市", "宿迁市", "盐城市", "扬州市",
	//								"泰州市", "南通市", "镇江市", "常州市", "无锡市", "苏州市"},
	//						{"合肥市", "芜湖市", "蚌埠市", "淮南市", "马鞍山市", "淮北市", "铜陵市",
	//								"安庆市", "黄山市", "滁州市", "阜阳市", "宿州市", "巢湖市", "六安市",
	//								"亳州市", "池州市", "宣城市"},
	//						{"南昌市", "萍乡市", "九江市", "新余市", "鹰潭市", "赣州市", "吉安市", "宜春市",
	//								"抚州市", "上饶市"},
	//						{"杭州市", "宁波市", "温州市", "嘉兴市", "绍兴市", "金华市", "衢州市", "舟山市",
	//								"台州市", "丽水市"},
	//						{"福州市", "厦门市", "三明市", "莆田市", "泉州市", "漳州市", "南平市", "龙岩市",
	//								"宁德市"},
	//						{"广州市", "深圳市", "珠海市", "汕头市", "韶关市", "惠州市", "河源市", "梅州市",
	//								"汕尾市", "东莞市", "中山市", "江门市", "佛山市", "阳江市", "湛江市",
	//								"茂名市", "肇庆市", "清远市", "潮州市", "揭阳市", "云浮市"},
	//						{"海口市", "三亚市"},
	//						{"台北市", "高雄市", "基隆市", "台中市", "台南市", "新竹市",
	//								"嘉义市台北县(板桥市)", "宜兰县(宜兰市)", "新竹县(竹北市)",
	//								"桃园县(桃园市)", "苗栗县(苗栗市)", "台中县(丰原市) 彰化县(彰化市)",
	//								" 南投县(南投市)", " 嘉义县(太保市)", " 云林县(斗六市)",
	//								"台南县(新营市)", " 高雄县(凤山市)", "屏东县(屏东市)", "台东县(台东市)",
	//								"花莲县(花莲市)", "澎湖县(马公市) "},
	//						{"贵阳市", "六盘水市", "遵义市", "安顺市", "铜仁地区", "毕节地区",
	//								"黔西南布依族苗族自治州", "黔东南南苗族侗族自治州", "黔南布依族苗族自治州"},
	//						{"昆明市", "玉溪市", "保山市", "昭通市", "思茅地区", "临沧地区", "丽江地区",
	//								"文山壮族苗族自治州", "红河哈尼族彝族自治州", "西双版纳傣族自治州",
	//								"楚雄彝族自治州", "大理白族自治州", "德宏傣族景颇族自治州", "怒江傈僳族自治州",
	//								"迪庆藏族自治州"},
	//						{"成都市", "自贡市", "攀枝花市", "泸州市", "德阳市", "绵阳市", "广元市",
	//								"遂宁市", "内江市", "乐山市", "南充市", "宜宾市", "广安市", "达州市",
	//								"眉山市", "雅安市", "巴中市", "资阳市", "阿坝藏族羌族自治州",
	//								"甘孜藏族自治州", "凉山彝族自治州"},
	//						{"长沙市", "株洲市", "湘潭市", "衡阳市", "邵阳市", "岳阳市", "常德市",
	//								"张家界市", "益阳市", "郴州市", "永市", "怀化市", "娄底市",
	//								"湘西土家族苗族自治州"},
	//						{"武汉市", "黄石市", "襄樊市", "十堰市", "荆州市", "宜昌市", "荆门市", "鄂州市",
	//								"孝感市", "黄冈市", "咸宁市", "随州市", "恩施土家族苗族自治州",
	//								"省直辖行政单位：仙桃市", "天门市", "潜江市", "神农架林区"},
	//						{"西安市", "铜川市", "宝鸡市", "咸阳市", "渭南市", "延安市", "汉中市", "榆林市",
	//								"安康市", "商洛市"},
	//						{"兰州市", "金昌市", "白银市", "天水市", "嘉峪关市", "武威市", "张掖市",
	//								"平凉市", "酒泉市", "庆阳市", "定西地区", "陇南地区", "甘南藏族自治州",
	//								"临夏回族自治州"},
	//						{"西宁市", "海东地区", "海北藏族自治州", "黄南藏族自治州", "海南藏族自治州",
	//								"果洛藏族自治州", "玉树藏族自治州", "海西蒙古族藏族自治州"},
	//						{"呼和浩特市", "包头市", "乌海市", "赤峰市", "鄂尔多斯市", "呼伦贝尔市",
	//								"乌兰察布盟", "锡林郭勒盟", "巴彦淖尔盟", "阿拉善盟", "兴安盟"},
	//						{"拉萨市", "昌都地区", "山南地区", "日喀则地区", "阿里地区", "林芝地区"},
	//						{"乌鲁木齐市", "克拉玛依市", "吐鲁番地区", "哈密地区", "和田地区", "阿克苏地区",
	//								"喀什地区", "克孜勒苏柯尔克孜自治州", "巴音郭楞州", "昌吉州", "博尔塔拉州",
	//								"伊犁哈萨克自治州", "塔城地区", "阿勒泰州", "省直辖行政单位：石河子市",
	//								"阿拉尔市", "图木舒克市", "五家渠市"},
	//						{"南宁市", "柳州市", "桂林市", "梧州市", "北海市", "防城港市", "钦州市",
	//								"贵港市", "玉林市", "百色市", "贺州市", "河池市", "来宾市",
	//								"崇左市 "},};
	//
	//				if (e.getStateChange() == 1)
	//				{
	//					mCityComboBox.setModel(new DefaultComboBoxModel<>(
	//							new String[]{"--请选择市/区--"}));
	//					String mProvenceStr = (String) mProvenceComboBox
	//							.getSelectedItem();
	//
	//					String[] datas = cityStr[mProvenceComboBox
	//							.getSelectedIndex()];
	//					ComboBoxModel<String> data = new DefaultComboBoxModel<String>(
	//							datas);
	//					mCityComboBox.setModel(data);
	//					mCityComboBox.addItemListener(new ItemListener()
	//					{
	//						@Override
	//						public void itemStateChanged(ItemEvent e)
	//						{
	//							if (e.getStateChange() == 1)
	//							{
	//								String mCityStr = (String) mCityComboBox
	//										.getSelectedItem();
	//							}
	//						}
	//					});
	//				}
	//			}
	//		});
	//
	//		add(addressLabel);
	//		add(mProvenceComboBox);
	//		add(mCityComboBox);
	//
	//	}
}
